// 设置控制台编码为UTF-8以支持中文显示
const { setupConsoleEncoding } = require('../utils/encoding-utils');
setupConsoleEncoding();

const { ipcMain, BrowserWindow } = require('electron');
const axios = require('axios');

// 引入 message-handlers 以便直接调用
let messageHandlers = null;

/**
 * 设置相关的 IPC 处理器
 * 管理应用配置、模型选择和Ollama连接状态
 */
class SettingsHandlers {
    constructor() {
        this.config = null;
    }    /**
     * 初始化设置处理器
     * @param {Function} onModelUpdate - 模型更新回调函数
     * @param {Object} messageHandlersInstance - message-handlers 实例
     * @param {Object} initialConfig - 从 app.js 传递的初始配置
     */
    initialize(onModelUpdate = null, messageHandlersInstance = null, initialConfig = null) {
        this.onModelUpdate = onModelUpdate;
        
        // 如果有初始配置，则使用它覆盖默认配置
        if (initialConfig) {
            console.log('使用从 app.js 传递的初始配置');
            this.config = { ...this.config, ...initialConfig };
        }
        
        // 设置 message-handlers 的引用
        if (messageHandlersInstance) {
            messageHandlers = messageHandlersInstance;
        }

        this.registerHandlers();
        console.log('设置处理器已初始化，当前配置:', this.config);
    }

    /**
     * 注册所有设置相关的 IPC 处理器
     */
    registerHandlers() {

        // 获取Ollama模型列表
        ipcMain.handle('get-models', this.handleGetModels.bind(this));

        // 获取当前设置 (新API)
        ipcMain.handle('get-settings', this.handleGetSettings.bind(this));

        // 更新设置
        ipcMain.handle('update-settings', this.handleUpdateSettings.bind(this));

        // 检查Ollama状态
        ipcMain.on('check-ollama-status', this.handleCheckOllamaStatus.bind(this));

    }

    /**
     * 获取可用模型列表 (旧API)
     */
    async handleGetModels(event) {
        try {
            console.log('获取Ollama模型列表');
            const response = await axios.get(`${this.getTagsEndpoint()}`);

            if (response.data && response.data.models) {
                return response.data.models;
            } else {
                throw new Error('无效的API响应');
            }
        } catch (error) {
            console.error('获取模型列表失败:', error.message);
            throw error;
        }
    }

    /**
     * 获取当前设置
     */
    handleGetSettings() {
        return this.config;
    }

    /**
     * 更新设置（合并了配置保存功能）(新API)
     */
    handleUpdateSettings(event, settings) {
        // 更新全局变量
        this.config = settings;        // 如果有回调函数，通知主进程更新
        if (this.onModelUpdate) {
            this.onModelUpdate(this.config);
        }

        // 直接调用 message-handlers 的方法更新设置
        if (messageHandlers) {
            console.log('直接调用 message-handlers 更新设置');
            messageHandlers.handleSettingsUpdate(null, settings);
        }

        // 通知所有窗口设置已更新
        console.log('准备发送 settings-updated 事件到所有窗口');
        BrowserWindow.getAllWindows().forEach(window => {
            console.log('发送 settings-updated 事件到窗口:', window.id);
            window.webContents.send('settings-updated', settings);
        });

        console.log('设置已更新并保存');
        return settings;
    }

    /**
     * 检查Ollama状态
     */
    async handleCheckOllamaStatus(event) {
        try {
            await axios.get(`${this.tagsEndpoint()}`);
            event.reply('ollama-status', true);
        } catch (error) {
            event.reply('ollama-status', false);
        }
    }


    getBaseUrl() {
        return this.config.ollama.OLLAMA_BASE_URL;
    }

    getGenerateEndpoint() {
        return this.getBaseUrl() + this.config.ollama.api.generate;
    }

    getTagsEndpoint() {
        return this.getBaseUrl() + this.config.ollama.api.tags;
    }

    /**
     * 获取当前模型
     */
    getCurrentModel() {
        return this.config.ollama.model;
    }

    /**
     * 获取当前配置
     */
    getCurrentConfig() {
        return this.config;
    }

    /**
     * 更新模型
     */
    updateModel(model) {
        this.config.ollama.model = model;
    }
}

// 导出单例实例
const settingsHandlers = new SettingsHandlers();
module.exports = settingsHandlers;
